package file

import (
	"guns-go/global"
	"guns-go/model/common"
	"io"
)

//文件操纵者（内网操作）
//如果存在未包含的操作，可以调用getClient()自行获取client进行操作
//q.zhangr
//2018-06-27-下午12:37
type OperatorFile interface {

	//初始化操作的客户端
	InitClient() error

	//销毁操作的客户端
	DestroyClient() error

	//获取操作的客户端
	GetClient() (error, interface{})

	//查询存储桶是否存在
	//例如：传入参数examplebucket-1250000000，返回true代表存在此桶
	DoesBucketExist(bucketName string) (bool, error)

	//设置预定义策略
	//预定义策略如公有读、公有读写、私有读
	SetBucketAcl(bucketName string, BucketAuthEnum common.BucketAuthType) error

	//判断是否存在文件
	//bucketName 桶名称
	//key        唯一标示id，例如a.txt, doc/a.txt
	IsExistingFile(bucketName string, key string) (bool, error)

	//存储文件
	//bucketName 桶名称
	//key        唯一标示id，例如a.txt, doc/a.txt
	//bytes      文件字节数组
	StorageFile(bucketName string, key string, byteS []byte) error

	//存储文件
	//bucketName 桶名称
	//key        唯一标示id，例如a.txt, doc/a.txt
	//reader      文件流
	StorageFileWithReader(bucketName string, key string, reader io.Reader) error

	//获取某个bucket下的文件字节
	//bucketName 桶名称
	//key        唯一标示id，例如a.txt, doc/a.txt
	GetFileBytes(bucketName string, key string) ([]byte, error)

	//文件访问权限管理
	//bucketName     桶名称
	//key            唯一标示id，例如a.txt, doc/a.txt
	//bucketAuthEnum 文件权限
	SetFileAcl(bucketName string, key string, BucketAuthEnum common.BucketAuthType) error

	//拷贝文件
	//originBucketName 源文件桶
	//originFileKey    源文件名称
	//newBucketName    新文件桶
	//newFileKey       新文件名称
	CopyFile(originBucketName string, originFileKey string, newBucketName string, newFileKey string) error

	//获取文件的下载地址（带鉴权的），生成外网地址
	//bucketName 文件桶
	//key        文件唯一标识
	GetFileAuthUrl(bucketName string, key string, timeoutMillis int64) (string, error)

	//删除文件
	//bucketName 文件桶
	//key        文件唯一标识
	DeleteFile(bucketName string, key string) error
}

//@author: [q.zhangr](https://github.com/zqlove001)
//@function: NewFileOperator
//@description: OSS接口
//@description: OSS的实例化方法
//@return: OperatorFile
func NewFileOperator() OperatorFile {
	switch global.GVA_CONFIG.System.OssType {
	case "aliyun-oss":
		return &AliYunOSS{}
	default:
		return &AliYunOSS{}
	}
}
